home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume23 / xenix-gnu / part03 < prev    next >
Encoding:
Text File  |  1991-09-27  |  49.9 KB  |  1,822 lines

  1. Newsgroups: comp.sources.misc
  2. From: steve@robobar.co.uk (Steve Bleazard)
  3. Subject:  v23i030:  xenix-gnu - Xenix 386 patchkit for GCC / GAS and GDB, Part03/03
  4. Message-ID: <1991Sep27.050011.16149@sparky.imd.sterling.com>
  5. X-Md4-Signature: 45d481dc5fe1fd86ac9803d3ae052d4e
  6. Date: Fri, 27 Sep 1991 05:00:11 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: steve@robobar.co.uk (Steve Bleazard)
  10. Posting-number: Volume 23, Issue 30
  11. Archive-name: xenix-gnu/part03
  12. Environment: SCOXENIX
  13.  
  14. #! /bin/sh
  15. # This is a shell archive.  Remove anything before this line, then feed it
  16. # into a shell via "sh file" or similar.  To overwrite existing files,
  17. # type "sh file -c".
  18. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  19. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  20. # Contents:  gas-1.38.pch
  21. # Wrapped by kent@sparky on Thu Sep 26 23:27:44 1991
  22. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  23. echo If this archive is complete, you will see the following message:
  24. echo '          "shar: End of archive."'
  25. if test -f 'gas-1.38.pch' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'gas-1.38.pch'\"
  27. else
  28.   echo shar: Extracting \"'gas-1.38.pch'\" \(47292 characters\)
  29.   sed "s/^X//" >'gas-1.38.pch' <<'END_OF_FILE'
  30. X*** gas-1.38/Makefile    Thu Oct 18 15:26:42 1990
  31. X--- Makefile    Fri Jul 12 06:02:10 1991
  32. X***************
  33. X*** 50,55 ****
  34. X--- 50,61 ----
  35. X  # and un-comment the next two lines.
  36. X  # G0 = -g -I. -DUSE_SYSTEM_HDR -DEXEC_VERSION=1
  37. X  # LOADLIBES = -lc /usr/att/lib/libc.a
  38. X+ #
  39. X+ # To compile gas for a Xenix 386, comment out all the above lines,
  40. X+ # and un-comment the next two lines.  (If you are using GCC, comment out the
  41. X+ # alloca.o part) (Get alloca from the emacs distribution, or use GCC.)
  42. X+ G0 = -O -I. -DUSG -DWORKING_DOT_WORD
  43. X+ LOADLIBES = alloca.o -lmalloc
  44. X  
  45. X  # If you just want to compile the vax assembler, type 'make avax'
  46. X  
  47. X***************
  48. X*** 129,134 ****
  49. X--- 135,144 ----
  50. X  CFLAGS = $(G0) $(G1) $(G2) $(G3) $(G4)
  51. X  
  52. X  #
  53. X+ #
  54. X+ # To make the XENIX 386 assembler compile as the default, un-comment the next
  55. X+ # line and commment out all the other lines that start with DEFAULT_GAS
  56. X+ #DEFAULT_GAS=ax386
  57. X  # To make the 68020 assembler compile as the default, un-comment the next
  58. X  # line, and comment out all the other lines that start with DEFAULT_GAS
  59. X  DEFAULT_GAS=a68
  60. X***************
  61. X*** 245,250 ****
  62. X--- 255,269 ----
  63. X  
  64. X  a386: $a $x
  65. X      $(CC) -o a386 $(LDFLAGS) $a $x $(LOADLIBES)
  66. X+ 
  67. X+ # XENIX 80386 GAS --------------------------------------------------------------
  68. X+ u = xenixomf.o omfwrite.o
  69. X+ U = xenixomf.c xenixomf.h msomf.h omfwrite.c
  70. X+ 
  71. X+ xenixomf.o:    xenixomf.h msomf.h
  72. X+ 
  73. X+ ax386: $a $x $u
  74. X+     $(CC) -o ax386 $(LDFLAGS) $a $u $x $(LOADLIBES)
  75. X  
  76. X  # 68020 GAS ------------------------------------------------------------------
  77. X  y = m68k.o  atof-ieee.o write.o read.o
  78. X*** gas-1.38/as.c    Thu Oct 11 11:26:17 1990
  79. X--- as.c    Wed Jul 10 09:01:54 1991
  80. X***************
  81. X*** 84,89 ****
  82. X--- 84,90 ----
  83. X      myname=argv[0];
  84. X      bzero (flagseen, sizeof(flagseen)); /* aint seen nothing yet */
  85. X      out_file_name    = "a.out";    /* default .o file */
  86. X+     module_name = "unknown.s";
  87. X      symbol_begin();        /* symbols.c */
  88. X      subsegs_begin();        /* subsegs.c */
  89. X      read_begin();            /* read.c */
  90. X*** gas-1.38/as.h    Thu Oct 11 11:26:18 1990
  91. X--- as.h    Wed Jul 10 09:01:58 1991
  92. X***************
  93. X*** 286,291 ****
  94. X--- 286,292 ----
  95. X  
  96. X  COMMON int    need_pass_2;    /* TRUE if we need a second pass. */
  97. X  
  98. X+ COMMON char *module_name;    /* Name given in the file directive */
  99. X  
  100. X  #endif                /* #ifdef asH */
  101. X  
  102. X*** gas-1.38/config.h
  103. X--- config.h    Wed Jul 10 09:16:07 1991
  104. X***************
  105. X*** 0 ****
  106. X--- 1 ----
  107. X+ #define XENIX
  108. X*** gas-1.38/msomf.h
  109. X--- msomf.h    Wed Jul 10 09:02:22 1991
  110. X***************
  111. X*** 0 ****
  112. X--- 1,24 ----
  113. X+ 
  114. X+ /* Segment indexes for segdefs */
  115. X+ 
  116. X+ #define SDEF_TEXT    1
  117. X+ #define SDEF_DATA    2
  118. X+ #define SDEF_CONST    3
  119. X+ #define SDEF_BSS    4
  120. X+ #define SDEF_SYMBOLS    5
  121. X+ #define SDEF_TYPES    6
  122. X+ #define SDEF_SIZE    4
  123. X+ #define SDEF_G_SIZE    6
  124. X+ 
  125. X+ #define GDEF_DGROUP    1
  126. X+ 
  127. X+ #define I386        1
  128. X+ #define FRAME_THREAD    1
  129. X+ #define TARGET_THREAD    0
  130. X+ 
  131. X+ #define TEXT_FRAME_THREAD    0
  132. X+ #define DGROUP_FRAME_THREAD    1
  133. X+ #define CONST_TGT_THREAD    0
  134. X+ #define DATA_TGT_THREAD        1
  135. X+ #define TEXT_TGT_THREAD        2
  136. X+ #define BSS_TGT_THREAD        3
  137. X*** gas-1.38/omfwrite.c
  138. X--- omfwrite.c    Wed Jul 10 09:02:24 1991
  139. X***************
  140. X*** 0 ****
  141. X--- 1,672 ----
  142. X+ /* write.c - emit .o file - Copyright(C)1986 Free Software Foundation, Inc.
  143. X+    Copyright (C) 1986,1987 Free Software Foundation, Inc.
  144. X+ 
  145. X+ This file is part of GAS, the GNU Assembler.
  146. X+ 
  147. X+ GAS is free software; you can redistribute it and/or modify
  148. X+ it under the terms of the GNU General Public License as published by
  149. X+ the Free Software Foundation; either version 1, or (at your option)
  150. X+ any later version.
  151. X+ 
  152. X+ GAS is distributed in the hope that it will be useful,
  153. X+ but WITHOUT ANY WARRANTY; without even the implied warranty of
  154. X+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  155. X+ GNU General Public License for more details.
  156. X+ 
  157. X+ You should have received a copy of the GNU General Public License
  158. X+ along with GAS; see the file COPYING.  If not, write to
  159. X+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  160. X+ 
  161. X+ #include "as.h"
  162. X+ #include "md.h"
  163. X+ #include "subsegs.h"
  164. X+ #include "obstack.h"
  165. X+ #include "struc-symbol.h"
  166. X+ #include "write.h"
  167. X+ #include "symbols.h"
  168. X+ 
  169. X+ #include "xenixomf.h"
  170. X+ #include "msomf.h"
  171. X+ 
  172. X+ #if __STDC__
  173. X+ #include <stddef.h>
  174. X+ #else
  175. X+ #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
  176. X+ #endif
  177. X+ 
  178. X+ void    append();
  179. X+ 
  180. X+ /*
  181. X+  * In: length of relocation (or of address) in chars: 1, 2 or 4.
  182. X+  * Out: OMF LOC type.
  183. X+  */
  184. X+ 
  185. X+ static unsigned char nbytes_r_length [] = {
  186. X+   15, LOC_LOBYTE, LOC_OFFSET, 15, LOC_OFFSET32
  187. X+   };
  188. X+ 
  189. X+ 
  190. X+ static struct frag *    text_frag_root;
  191. X+ static struct frag *    data_frag_root;
  192. X+ 
  193. X+ static struct frag *    text_last_frag;    /* Last frag in segment. */
  194. X+ static struct frag *    data_last_frag;    /* Last frag in segment. */
  195. X+ 
  196. X+ static struct exec    the_exec;
  197. X+ 
  198. X+ static long int string_byte_count;
  199. X+ static long int stab_symbol_count;
  200. X+ 
  201. X+ void    relax_segment();
  202. X+ long int    fixup_segment();
  203. X+ 
  204. X+ static void threads(type, trgt_thrd, frm_thrd)
  205. X+ int type;
  206. X+ int *trgt_thrd, *frm_thrd;
  207. X+ {
  208. X+       switch (type)
  209. X+       {
  210. X+         case PRIVDATA:    *trgt_thrd = DATA_TGT_THREAD;
  211. X+                 *frm_thrd = DGROUP_FRAME_THREAD;
  212. X+                 break;
  213. X+         case PRIVBSS:    *trgt_thrd = BSS_TGT_THREAD;
  214. X+                 *frm_thrd = DGROUP_FRAME_THREAD;
  215. X+                 break;
  216. X+         case PRIVTEXT:    *trgt_thrd = TEXT_TGT_THREAD;
  217. X+                 *frm_thrd = TEXT_FRAME_THREAD;
  218. X+                 break;
  219. X+         case PUBLICDATA:    *trgt_thrd = DATA_TGT_THREAD;
  220. X+                 *frm_thrd = DGROUP_FRAME_THREAD;
  221. X+                 break;
  222. X+         case PUBLICTEXT:    *trgt_thrd = TEXT_TGT_THREAD;
  223. X+                 *frm_thrd = TEXT_FRAME_THREAD;
  224. X+                 break;
  225. X+         default:        *trgt_thrd = CONST_TGT_THREAD;
  226. X+                 *frm_thrd = DGROUP_FRAME_THREAD;
  227. X+                 break;
  228. X+       }
  229. X+ }
  230. X+ 
  231. X+ void
  232. X+ write_object_file()
  233. X+ {
  234. X+   register struct frchain *    frchainP; /* Track along all frchains. */
  235. X+   register fragS *        fragP;    /* Track along all frags. */
  236. X+   register struct frchain *    next_frchainP;
  237. X+   register fragS * *        prev_fragPP;
  238. X+   register char *        name;
  239. X+   register symbolS *        symbolP;
  240. X+   register symbolS **        symbolPP;
  241. X+   /* register fixS *        fixP; JF unused */
  242. X+   unsigned long
  243. X+       text_siz,
  244. X+     data_siz,
  245. X+     syms_siz,
  246. X+     tr_siz,
  247. X+     dr_siz;
  248. X+   void output_file_create();
  249. X+   void output_file_append();
  250. X+   void output_file_close();
  251. X+   extern long omagic;        /* JF magic # to write out.  Is different for
  252. X+                    Suns and Vaxen and other boxes */
  253. X+ 
  254. X+   /*
  255. X+    * After every sub-segment, we fake an ".align ...". This conforms to BSD4.2
  256. X+    * brane-damage. We then fake ".fill 0" because that is the kind of frag
  257. X+    * that requires least thought. ".align" frags like to have a following
  258. X+    * frag since that makes calculating their intended length trivial.
  259. X+    */
  260. X+ #define SUB_SEGMENT_ALIGN (2)
  261. X+   for ( frchainP=frchain_root; frchainP; frchainP=frchainP->frch_next )
  262. X+     {
  263. X+       subseg_new (frchainP -> frch_seg, frchainP -> frch_subseg);
  264. X+       frag_align (SUB_SEGMENT_ALIGN, 0);
  265. X+                 /* frag_align will have left a new frag. */
  266. X+                 /* Use this last frag for an empty ".fill". */
  267. X+       /*
  268. X+        * For this segment ...
  269. X+        * Create a last frag. Do not leave a "being filled in frag".
  270. X+        */
  271. X+       frag_wane (frag_now);
  272. X+       frag_now -> fr_fix    = 0;
  273. X+       know( frag_now -> fr_next == NULL );
  274. X+       /* know( frags . obstack_c_base == frags . obstack_c_next_free ); */
  275. X+       /* Above shows we haven't left a half-completed object on obstack. */
  276. X+     }
  277. X+ 
  278. X+   /*
  279. X+    * From now on, we don't care about sub-segments.
  280. X+    * Build one frag chain for each segment. Linked thru fr_next.
  281. X+    * We know that there is at least 1 text frchain & at least 1 data frchain.
  282. X+    */
  283. X+   prev_fragPP = &text_frag_root;
  284. X+   for ( frchainP=frchain_root; frchainP; frchainP=next_frchainP )
  285. X+     {
  286. X+       know( frchainP -> frch_root );
  287. X+       * prev_fragPP = frchainP -> frch_root;
  288. X+       prev_fragPP = & frchainP -> frch_last -> fr_next;
  289. X+       if (   ((next_frchainP = frchainP->frch_next) == NULL)
  290. X+       || next_frchainP == data0_frchainP)
  291. X+     {
  292. X+       prev_fragPP = & data_frag_root;
  293. X+       if ( next_frchainP )
  294. X+         {
  295. X+           text_last_frag = frchainP -> frch_last;
  296. X+         }
  297. X+       else
  298. X+         {
  299. X+           data_last_frag = frchainP -> frch_last;
  300. X+         }
  301. X+     }
  302. X+     }                /* for(each struct frchain) */
  303. X+ 
  304. X+   relax_segment (text_frag_root, SEG_TEXT);
  305. X+   relax_segment (data_frag_root, SEG_DATA);
  306. X+   /*
  307. X+    * Now the addresses of frags are correct within the segment.
  308. X+    */
  309. X+ 
  310. X+   text_siz=text_last_frag->fr_address;
  311. X+ 
  312. X+   /*
  313. X+    *
  314. X+    * Determine a_data [length of data segment].
  315. X+    */
  316. X+   if (data_frag_root)
  317. X+       data_siz=data_last_frag->fr_address;
  318. X+   else
  319. X+       data_siz = 0;
  320. X+ 
  321. X+   bss_address_frag . fr_address = 0;
  322. X+           
  323. X+   /*
  324. X+    *
  325. X+    * Crawl the symbol chain.
  326. X+    *
  327. X+    * For each symbol whose value depends on a frag, take the address of
  328. X+    * that frag and subsume it into the value of the symbol.
  329. X+    * After this, there is just one way to lookup a symbol value.
  330. X+    * Values are left in their final state for object file emission.
  331. X+    * We adjust the values of 'L' local symbols, even if we do
  332. X+    * not intend to emit them to the object file, because their values
  333. X+    * are needed for fix-ups.
  334. X+    *
  335. X+    * Unless we saw a -L flag, remove all symbols that begin with 'L'
  336. X+    * from the symbol chain.
  337. X+    *
  338. X+    * Count the (length of the nlists of the) (remaining) symbols.
  339. X+    * Assign a symbol number to each symbol.
  340. X+    * Count the number of string-table chars we will emit.
  341. X+    *
  342. X+    */
  343. X+   string_byte_count = sizeof( string_byte_count );
  344. X+ 
  345. X+   /* JF deal with forward references first. . . */
  346. X+   for(symbolP=symbol_rootP;symbolP;symbolP=symbolP->sy_next) {
  347. X+       if(symbolP->sy_forward) {
  348. X+         symbolP->sy_value+=symbolP->sy_forward->sy_value+symbolP->sy_forward->sy_frag->fr_address;
  349. X+         symbolP->sy_forward=0;
  350. X+     }
  351. X+   }
  352. X+   symbolPP = & symbol_rootP;    /* -> last symbol chain link. */
  353. X+   {
  354. X+     register long int        symbol_number;
  355. X+ 
  356. X+     symbol_number = 1;  stab_symbol_count = 0;
  357. X+ 
  358. X+     while (symbolP  = * symbolPP)
  359. X+       {
  360. X+     name = symbolP -> sy_name;
  361. X+     symbolP -> sy_value += symbolP -> sy_frag -> fr_address;
  362. X+     if ( !name || (symbolP->sy_nlist.n_type&N_STAB)
  363. X+         || (name[0]!='\001' && (flagseen ['L'] || name [0] != 'L' )))
  364. X+       {
  365. X+         if (EXTDEF(symbolP->sy_nlist.n_type))
  366. X+             symbolP -> sy_number = symbol_number ++;
  367. X+         else
  368. X+             symbolP -> sy_number = 0;
  369. X+         if (symbolP->sy_nlist.n_type&N_STAB)
  370. X+         stab_symbol_count++;
  371. X+         if (name && symbolP->sy_nlist.n_type&N_STAB)
  372. X+           {            /* Ordinary case. */
  373. X+         symbolP -> sy_name_offset = string_byte_count;
  374. X+         string_byte_count += strlen (symbolP  -> sy_name) + 1;
  375. X+           }
  376. X+         else            /* .Stabd case. */
  377. X+         symbolP -> sy_name_offset = 0;
  378. X+         symbolPP = & (symbolP -> sy_next);
  379. X+       }
  380. X+     else
  381. X+         * symbolPP = symbolP -> sy_next;
  382. X+       }                /* for each symbol */
  383. X+ 
  384. X+     syms_siz = sizeof( struct nlist) * symbol_number;
  385. X+   }
  386. X+ 
  387. X+   /*
  388. X+    * Addresses of frags now reflect addresses we use in the object file.
  389. X+    * Symbol values are correct.
  390. X+    * Scan the frags, converting any ".org"s and ".align"s to ".fill"s.
  391. X+    * Also converting any machine-dependent frags using md_convert_frag();
  392. X+    */
  393. X+   subseg_change( SEG_TEXT, 0);
  394. X+ 
  395. X+   for (fragP = text_frag_root;  fragP;  fragP = fragP -> fr_next)
  396. X+     {
  397. X+       switch (fragP -> fr_type)
  398. X+     {
  399. X+     case rs_align:
  400. X+     case rs_org:
  401. X+       fragP -> fr_type = rs_fill;
  402. X+       know( fragP -> fr_var == 1 );
  403. X+       know( fragP -> fr_next );
  404. X+       fragP -> fr_offset
  405. X+         =     fragP -> fr_next -> fr_address
  406. X+           -   fragP -> fr_address
  407. X+         - fragP -> fr_fix;
  408. X+       break;
  409. X+ 
  410. X+     case rs_fill:
  411. X+       break;
  412. X+ 
  413. X+     case rs_machine_dependent:
  414. X+       md_convert_frag (fragP);
  415. X+       /*
  416. X+        * After md_convert_frag, we make the frag into a ".space 0".
  417. X+        * Md_convert_frag() should set up any fixSs and constants
  418. X+        * required.
  419. X+        */
  420. X+       frag_wane (fragP);
  421. X+       break;
  422. X+ 
  423. X+     default:
  424. X+       BAD_CASE( fragP -> fr_type );
  425. X+       break;
  426. X+     }            /* switch (fr_type) */
  427. X+     }                /* for each frag. */
  428. X+ 
  429. X+ 
  430. X+   subseg_change( SEG_DATA, 0);
  431. X+ 
  432. X+   for (fragP = data_frag_root;  fragP;  fragP = fragP -> fr_next)
  433. X+     {
  434. X+       switch (fragP -> fr_type)
  435. X+     {
  436. X+     case rs_align:
  437. X+     case rs_org:
  438. X+       fragP -> fr_type = rs_fill;
  439. X+       know( fragP -> fr_var == 1 );
  440. X+       know( fragP -> fr_next );
  441. X+       fragP -> fr_offset
  442. X+         =     fragP -> fr_next -> fr_address
  443. X+           -   fragP -> fr_address
  444. X+         - fragP -> fr_fix;
  445. X+       break;
  446. X+ 
  447. X+     case rs_fill:
  448. X+       break;
  449. X+ 
  450. X+     case rs_machine_dependent:
  451. X+       md_convert_frag (fragP);
  452. X+       /*
  453. X+        * After md_convert_frag, we make the frag into a ".space 0".
  454. X+        * Md_convert_frag() should set up any fixSs and constants
  455. X+        * required.
  456. X+        */
  457. X+       frag_wane (fragP);
  458. X+       break;
  459. X+ 
  460. X+     default:
  461. X+       BAD_CASE( fragP -> fr_type );
  462. X+       break;
  463. X+     }            /* switch (fr_type) */
  464. X+     }                /* for each frag. */
  465. X+ 
  466. X+   subseg_change( SEG_TEXT, 0);
  467. X+ 
  468. X+   fixup_segment (text_fix_root, N_TEXT);
  469. X+   fixup_segment (data_fix_root, N_DATA);
  470. X+   output_file_create (out_file_name);
  471. X+   omf_initialize_a_out(module_name, text_siz, data_siz,
  472. X+                (long) local_bss_counter, 0L,
  473. X+                flagseen['g'], stab_symbol_count * sizeof(struct nlist),
  474. X+                string_byte_count);
  475. X+ 
  476. X+ /*  Traverse the symbol chain emitting external symbol definitions
  477. X+  *  for external, public and common symbols.
  478. X+  */
  479. X+ 
  480. X+   for (   symbolP = symbol_rootP;   symbolP;   symbolP = symbolP -> sy_next   )
  481. X+   {
  482. X+       if (EXTDEF(symbolP->sy_type))
  483. X+       {
  484. X+           if (COMMDEF(symbolP->sy_type))
  485. X+           {
  486. X+               omf_start_comdef();
  487. X+               omf_comdef(symbolP->sy_name, TD_CNEAR, symbolP->sy_value, 0L);
  488. X+               omf_end_comdef();
  489. X+           }
  490. X+           else
  491. X+               omf_extdef(symbolP->sy_name, 0);
  492. X+       }
  493. X+   }
  494. X+ 
  495. X+ /*  Traverse the symbol chain emitting public definitions
  496. X+  */
  497. X+ 
  498. X+   for (   symbolP = symbol_rootP;   symbolP;   symbolP = symbolP -> sy_next   )
  499. X+   {
  500. X+     if (PUBLIC(symbolP->sy_type))
  501. X+     {
  502. X+         unsigned int group = 0, segment = 0;
  503. X+ 
  504. X+         if (symbolP->sy_type == PUBLICTEXT)
  505. X+             segment = SDEF_TEXT;
  506. X+         if (symbolP->sy_type == PUBLICDATA)
  507. X+         {
  508. X+             group = GDEF_DGROUP;  segment = SDEF_DATA;
  509. X+         }
  510. X+         
  511. X+         omf_start_pubdef(I386, group, segment, 0);
  512. X+         omf_pubdef(I386, symbolP->sy_name, symbolP->sy_value, 0);
  513. X+         omf_end_pubdef();
  514. X+     }
  515. X+   }
  516. X+   
  517. X+ 
  518. X+   /* Setup threads for DGROUP and the segments ready for relocation */
  519. X+ 
  520. X+   omf_start_thread(I386);
  521. X+   omf_thread(CONST_TGT_THREAD, TARGET_THREAD, FRM_SI, SDEF_CONST);
  522. X+   omf_thread(DATA_TGT_THREAD, TARGET_THREAD, FRM_SI, SDEF_DATA);
  523. X+   omf_thread(TEXT_TGT_THREAD, TARGET_THREAD, FRM_SI, SDEF_TEXT);
  524. X+   omf_thread(BSS_TGT_THREAD, TARGET_THREAD, FRM_SI, SDEF_BSS);
  525. X+   omf_thread(TEXT_FRAME_THREAD, FRAME_THREAD, FRM_SI, SDEF_TEXT);
  526. X+   omf_thread(DGROUP_FRAME_THREAD, FRAME_THREAD, FRM_GI, GDEF_DGROUP);
  527. X+   omf_end_thread();
  528. X+   
  529. X+   /*
  530. X+    * Emit code.
  531. X+    */
  532. X+ 
  533. X+   for (fragP = data_frag_root;  fragP;  fragP = fragP -> fr_next)
  534. X+   {
  535. X+       register long int count;
  536. X+       register char * fill_literal;
  537. X+       register long int fill_size;
  538. X+       register fixS * fixP;
  539. X+       register symbolS * symbolP;
  540. X+       int started_fixup;
  541. X+ 
  542. X+       know( fragP -> fr_type == rs_fill );
  543. X+ 
  544. X+       if (fragP->fr_fix != 0 || fragP->fr_offset != 0)
  545. X+       {
  546. X+           omf_start_ledata(I386, SDEF_DATA, fragP->fr_address);
  547. X+           if (fragP->fr_fix != 0)
  548. X+               omf_ledata(fragP->fr_literal, (int)fragP->fr_fix);
  549. X+           fill_literal = fragP->fr_literal + fragP -> fr_fix;
  550. X+           fill_size = fragP->fr_var;
  551. X+           count = fragP -> fr_offset;
  552. X+       if ((fragP->fr_fix + count * fill_size) < 1016)
  553. X+       {
  554. X+               for ( ; count; count--)
  555. X+                   omf_ledata(fill_literal, (int)fill_size);
  556. X+       }
  557. X+       else  /* filling will exceed the 1024 byte record size */
  558. X+       {
  559. X+           /* This code assumes that fill_size <= 8 bytes.
  560. X+            * This is infact the case because of
  561. X+            * compatability with other assemblers 
  562. X+            */
  563. X+           register int fcount;
  564. X+ 
  565. X+           fcount = (1016 - fragP->fr_fix) / fill_size;
  566. X+           count -= fcount;
  567. X+           for ( ; fcount > 0; fcount--)
  568. X+                   omf_ledata(fill_literal, (int)fill_size);
  569. X+           
  570. X+       }
  571. X+           omf_end_ledata();
  572. X+ 
  573. X+           /* Emit the relocations for this frag
  574. X+            */
  575. X+ 
  576. X+           fixP = data_fix_root;  started_fixup = 0;
  577. X+           for ( ;  fixP;  fixP = fixP -> fx_next)
  578. X+           {
  579. X+               if (fixP->fx_frag == fragP && (symbolP = fixP->fx_addsy))
  580. X+               {
  581. X+           int trgt_thrd, frm_thrd;
  582. X+           int external = EXTDEF(symbolP->sy_type);
  583. X+ 
  584. X+           threads(symbolP->sy_type, &trgt_thrd, &frm_thrd);
  585. X+           if (fixP->fx_pcrel)
  586. X+             frm_thrd = TEXT_FRAME_THREAD;
  587. X+ 
  588. X+                   if (!started_fixup)
  589. X+                   {
  590. X+                       omf_start_fixup(I386);
  591. X+                       started_fixup++;
  592. X+                   }
  593. X+                   omf_fixup(I386, !fixP->fx_pcrel,
  594. X+                 nbytes_r_length [fixP->fx_size], fixP->fx_where,
  595. X+                 external ? 0 : 1,
  596. X+                 external ? FRM_TRGT : frm_thrd,
  597. X+                 external ? 0 : 1,
  598. X+                 external ? TGT_EI : trgt_thrd,
  599. X+                 1, /* No offset */
  600. X+             0, /* No frame required */
  601. X+                 EXTDEF(symbolP->sy_type) ? symbolP->sy_number : 0,
  602. X+             0);
  603. X+           }
  604. X+           }
  605. X+           if (started_fixup)
  606. X+               omf_end_fixup();
  607. X+       
  608. X+       while (count > 0)    /* still sum fill data to emit */
  609. X+       {
  610. X+           unsigned long address;
  611. X+           unsigned int len;
  612. X+ 
  613. X+               address = fragP->fr_address + fragP->fr_fix +
  614. X+               (fragP->fr_offset - count) * fill_size;
  615. X+               omf_start_ledata(I386, SDEF_DATA, address);
  616. X+               for ( len = 0; count && (len < 1000); count--, len += fill_size)
  617. X+                   omf_ledata(fill_literal, (int)fill_size);
  618. X+               omf_end_ledata();
  619. X+       }
  620. X+       }
  621. X+   }
  622. X+ 
  623. X+   for (fragP = text_frag_root;  fragP;  fragP = fragP -> fr_next)
  624. X+   {
  625. X+       register long int count;
  626. X+       register char * fill_literal;
  627. X+       register long int fill_size;
  628. X+       register fixS * fixP;
  629. X+       register symbolS * symbolP;
  630. X+       int started_fixup;
  631. X+ 
  632. X+       know( fragP -> fr_type == rs_fill );
  633. X+ 
  634. X+       if (fragP->fr_fix != 0 || fragP->fr_offset != 0)
  635. X+       {
  636. X+           omf_start_ledata(I386, SDEF_TEXT, fragP->fr_address);
  637. X+           if (fragP->fr_fix != 0)
  638. X+               omf_ledata(fragP->fr_literal, (int)fragP->fr_fix);
  639. X+           fill_literal = fragP->fr_literal + fragP -> fr_fix;
  640. X+           fill_size = fragP->fr_var;
  641. X+           for (count = fragP -> fr_offset;  count;  count --)
  642. X+               omf_ledata(fill_literal, (int)fill_size);
  643. X+           omf_end_ledata();
  644. X+ 
  645. X+           /* Emit the relocations for this frag
  646. X+            */
  647. X+ 
  648. X+           fixP = text_fix_root;  started_fixup = 0;
  649. X+           for ( ;  fixP;  fixP = fixP -> fx_next)
  650. X+           {
  651. X+               if (fixP->fx_frag == fragP && (symbolP = fixP->fx_addsy))
  652. X+               {
  653. X+           int trgt_thrd, frm_thrd;
  654. X+           int external = EXTDEF(symbolP->sy_type);
  655. X+ 
  656. X+           threads(symbolP->sy_type, &trgt_thrd, &frm_thrd);
  657. X+           if (fixP->fx_pcrel)
  658. X+             frm_thrd = TEXT_FRAME_THREAD;
  659. X+ 
  660. X+                   if (!started_fixup)
  661. X+                   {
  662. X+                       omf_start_fixup(I386);
  663. X+                       started_fixup++;
  664. X+                   }
  665. X+                   omf_fixup(I386, !fixP->fx_pcrel,
  666. X+                 nbytes_r_length [fixP->fx_size], fixP->fx_where,
  667. X+                 external ? 0 : 1,
  668. X+                 external ? FRM_TRGT : frm_thrd,
  669. X+                 external ? 0 : 1,
  670. X+                 external ? TGT_EI : trgt_thrd,
  671. X+                 1, /* No offset */
  672. X+             0, /* No frame required */
  673. X+                 external ? symbolP->sy_number : 0,
  674. X+             0);
  675. X+           }
  676. X+           }
  677. X+           if (started_fixup)
  678. X+               omf_end_fixup();
  679. X+       }
  680. X+   }
  681. X+ 
  682. X+ /*  Traverse the symbol chain emitting stabs.
  683. X+  */
  684. X+ 
  685. X+ #define VAL_OFF offsetof(struct nlist, n_value)
  686. X+ 
  687. X+   if (flagseen['g'] && stab_symbol_count)
  688. X+   {   
  689. X+       long count = 0, ncount = 0;
  690. X+       symbolS *last_startP;
  691. X+       char *temp;
  692. X+       symbolS *fsymP;
  693. X+       int i;
  694. X+       int start_fixup = 0;
  695. X+ 
  696. X+       omf_start_ledata(I386, SDEF_SYMBOLS, 0);
  697. X+       last_startP = symbol_rootP;
  698. X+       for (symbolP = symbol_rootP; symbolP; symbolP = symbolP -> sy_next)
  699. X+       {
  700. X+      if (symbolP->sy_nlist.n_type & N_STAB)
  701. X+      {
  702. X+             if ((ncount + 1) * sizeof(struct nlist) >= 1016)
  703. X+             {
  704. X+                omf_end_ledata();
  705. X+ 
  706. X+                /* emit relocations */
  707. X+ 
  708. X+                start_fixup = 0;
  709. X+            for (i = 0, fsymP=last_startP; i < ncount; fsymP=fsymP->sy_next)
  710. X+            {
  711. X+               if (fsymP->sy_nlist.n_type & N_STAB)
  712. X+           {
  713. X+                      if (fsymP->sy_type & N_TYPE) /* if relocation required */
  714. X+              {
  715. X+                int trgt_thrd, frm_thrd;
  716. X+                int external = EXTDEF(fsymP->sy_type & N_TYPE);
  717. X+ 
  718. X+                threads(fsymP->sy_type & N_TYPE,&trgt_thrd,&frm_thrd);
  719. X+                if (!start_fixup)
  720. X+                {
  721. X+                            omf_start_fixup(I386);
  722. X+                start_fixup++;
  723. X+                }
  724. X+                omf_fixup(I386, 1, /* segment relative */
  725. X+                   LOC_OFFSET32, i * sizeof(struct nlist) + VAL_OFF,
  726. X+                   external ? 0 : 1,
  727. X+                   external ? FRM_TRGT : frm_thrd,
  728. X+                   external ? 0 : 1,
  729. X+                   external ? TGT_EI : trgt_thrd,
  730. X+                   1, /* No offset */
  731. X+               0, /* No frame required */
  732. X+                   external ? fsymP->sy_number : 0,
  733. X+               0);
  734. X+              }
  735. X+              i++;
  736. X+           }
  737. X+            }
  738. X+            if (start_fixup)
  739. X+                   omf_end_fixup();
  740. X+ 
  741. X+                /* start new segment */
  742. X+ 
  743. X+                ncount = 0;  last_startP = symbolP;
  744. X+                omf_start_ledata(I386, SDEF_SYMBOLS, count*sizeof(struct nlist));
  745. X+             }
  746. X+             temp = symbolP->sy_nlist.n_un.n_name;
  747. X+             symbolP->sy_nlist.n_un.n_strx = symbolP->sy_name_offset;
  748. X+             omf_ledata(&(symbolP->sy_nlist), sizeof(struct nlist));
  749. X+             symbolP->sy_nlist.n_un.n_name = temp;
  750. X+            ncount++;  count++;
  751. X+      }
  752. X+       }
  753. X+       omf_end_ledata();
  754. X+       start_fixup = 0;
  755. X+       for (i = 0, fsymP = last_startP; i < ncount; fsymP = fsymP->sy_next)
  756. X+       {
  757. X+          if (fsymP->sy_nlist.n_type & N_STAB)
  758. X+      {
  759. X+             if (fsymP->sy_type & N_TYPE) /* if relocation required */
  760. X+         {
  761. X+           int trgt_thrd, frm_thrd;
  762. X+           int external = EXTDEF(fsymP->sy_type & N_TYPE);
  763. X+ 
  764. X+           threads(fsymP->sy_type & N_TYPE,&trgt_thrd,&frm_thrd);
  765. X+           if (!start_fixup)
  766. X+               {
  767. X+                  omf_start_fixup(I386);
  768. X+                  start_fixup++;
  769. X+               }
  770. X+           omf_fixup(I386, 1, /* segment relative */
  771. X+              LOC_OFFSET32, i * sizeof(struct nlist) + VAL_OFF,
  772. X+              external ? 0 : 1,
  773. X+              external ? FRM_TRGT : frm_thrd,
  774. X+              external ? 0 : 1,
  775. X+              external ? TGT_EI : trgt_thrd,
  776. X+              1, /* No offset */
  777. X+                   0, /* No frame required */
  778. X+              external ? fsymP->sy_number : 0,
  779. X+           0);
  780. X+         }
  781. X+         i++;
  782. X+      }
  783. X+       }
  784. X+       if (start_fixup)
  785. X+          omf_end_fixup();
  786. X+ 
  787. X+       count = sizeof(string_byte_count);  ncount = count;
  788. X+       omf_start_ledata(I386, SDEF_TYPES, 0);
  789. X+       omf_ledata(&string_byte_count, sizeof(string_byte_count));
  790. X+       for (symbolP = symbol_rootP; symbolP; symbolP = symbolP -> sy_next)
  791. X+       {
  792. X+          if (symbolP->sy_nlist.n_type & N_STAB && symbolP -> sy_name)
  793. X+      {
  794. X+         int len = strlen(symbolP -> sy_name) + 1;
  795. X+ 
  796. X+         if (ncount + len > 1016)
  797. X+         {
  798. X+            omf_end_ledata();
  799. X+                omf_start_ledata(I386, SDEF_TYPES, count);
  800. X+            ncount = 0;
  801. X+         }
  802. X+             omf_ledata(symbolP->sy_name, len);
  803. X+         count += len;  ncount += len;
  804. X+      }
  805. X+       }
  806. X+       omf_end_ledata();
  807. X+   }
  808. X+   
  809. X+ 
  810. X+   omf_modend(I386);
  811. X+   output_file_close (out_file_name);
  812. X+ 
  813. X+ }                /* write_object_file() */
  814. X*** gas-1.38/read.c    Tue Oct 30 13:42:03 1990
  815. X--- read.c    Wed Jul 10 12:53:36 1991
  816. X***************
  817. X*** 711,717 ****
  818. X      int    length;
  819. X  
  820. X      /* Some assemblers tolerate immediately following '"' */
  821. X!     if ( s = demand_copy_string( & length ) ) {
  822. X          new_logical_line (s, -1);
  823. X          demand_empty_rest_of_line();
  824. X      }
  825. X--- 711,718 ----
  826. X      int    length;
  827. X  
  828. X      /* Some assemblers tolerate immediately following '"' */
  829. X!     if ( s = demand_copy_C_string( & length ) ) {
  830. X!         module_name = s;
  831. X          new_logical_line (s, -1);
  832. X          demand_empty_rest_of_line();
  833. X      }
  834. X***************
  835. X*** 1697,1703 ****
  836. X  void    /* JF was static, but can't be if VAX.C is goning to use it */
  837. X  float_cons(float_type)        /* Worker to do .float etc statements. */
  838. X                  /* Clobbers input_line-pointer, checks end-of-line. */
  839. X!      register float_type;    /* 'f':.ffloat ... 'F':.float ... */
  840. X  {
  841. X    register char *    p;
  842. X    register char        c;
  843. X--- 1698,1704 ----
  844. X  void    /* JF was static, but can't be if VAX.C is goning to use it */
  845. X  float_cons(float_type)        /* Worker to do .float etc statements. */
  846. X                  /* Clobbers input_line-pointer, checks end-of-line. */
  847. X!      register int float_type;    /* 'f':.ffloat ... 'F':.float ... */
  848. X  {
  849. X    register char *    p;
  850. X    register char        c;
  851. X*** gas-1.38/subsegs.c    Thu Oct 11 11:26:23 1990
  852. X--- subsegs.c    Wed Jul 10 09:02:02 1991
  853. X***************
  854. X*** 96,102 ****
  855. X--- 96,106 ----
  856. X    know( SEG_MAXIMUM_ORDINAL == SEG_DIFFERENCE );
  857. X    know( seg_name [(int) SEG_MAXIMUM_ORDINAL + 1] [0] == 0 );
  858. X  
  859. X+ #ifdef M_XENIX
  860. X+   obstack_begin( &frags, 1000);
  861. X+ #else
  862. X    obstack_begin( &frags, 5000);
  863. X+ #endif /* M_XENIX */
  864. X    frchain_root = NULL;
  865. X    frchain_now  = NULL;        /* Warn new_subseg() that we are booting. */
  866. X                  /* Fake up 1st frag. */
  867. X*** gas-1.38/write.c    Thu Oct 11 11:26:15 1990
  868. X--- write.c    Wed Jul 10 09:06:47 1991
  869. X***************
  870. X*** 38,43 ****
  871. X--- 38,46 ----
  872. X  #include "write.h"
  873. X  #include "symbols.h"
  874. X  
  875. X+ static relax_addressT    relax_align();
  876. X+ 
  877. X+ #ifndef M_XENIX
  878. X  #ifdef SPARC
  879. X  #include "sparc.h"
  880. X  #endif
  881. X***************
  882. X*** 93,103 ****
  883. X  
  884. X  static void    relax_segment();
  885. X  void        emit_segment();
  886. X- static relax_addressT    relax_align();
  887. X  static long int    fixup_segment();
  888. X  #if !defined(SPARC) && !defined(I860)
  889. X  static void        emit_relocations();
  890. X  #endif
  891. X   /*
  892. X   *            fix_new()
  893. X   *
  894. X--- 96,107 ----
  895. X  
  896. X  static void    relax_segment();
  897. X  void        emit_segment();
  898. X  static long int    fixup_segment();
  899. X  #if !defined(SPARC) && !defined(I860)
  900. X  static void        emit_relocations();
  901. X  #endif
  902. X+ 
  903. X+ #endif /* M_XENIX */
  904. X   /*
  905. X   *            fix_new()
  906. X   *
  907. X***************
  908. X*** 146,151 ****
  909. X--- 150,156 ----
  910. X    * seg_fix_rootP = fixP;
  911. X  }
  912. X  
  913. X+ #ifndef M_XENIX
  914. X  void
  915. X  write_object_file()
  916. X  {
  917. X***************
  918. X*** 683,688 ****
  919. X--- 688,694 ----
  920. X    VMS_write_object_file(text_siz, data_siz, text_frag_root, data_frag_root);
  921. X  #endif    /* VMS */
  922. X  }                /* write_object_file() */
  923. X+ #endif /* M_XENIX */
  924. X  
  925. X  /*
  926. X   *            relax_segment()
  927. X***************
  928. X*** 697,703 ****
  929. X--- 703,711 ----
  930. X   * these frag addresses may not be the same as final object-file addresses.
  931. X   */
  932. X  #ifndef    VMS
  933. X+ #ifndef M_XENIX
  934. X  static
  935. X+ #endif    /* not M_XENIX */
  936. X  #endif    /* not VMS */
  937. X  void
  938. X  relax_segment (segment_frag_root, segment_type)
  939. X***************
  940. X*** 1010,1016 ****
  941. X  /*
  942. X   *            fixup_segment()
  943. X   */
  944. X! static long int
  945. X  fixup_segment (fixP, this_segment_type)
  946. X       register fixS *    fixP;
  947. X       int        this_segment_type; /* N_TYPE bits for segment. */
  948. X--- 1018,1027 ----
  949. X  /*
  950. X   *            fixup_segment()
  951. X   */
  952. X! #ifndef M_XENIX 
  953. X! static
  954. X! #endif /* not M_XENIX */
  955. X! long int
  956. X  fixup_segment (fixP, this_segment_type)
  957. X       register fixS *    fixP;
  958. X       int        this_segment_type; /* N_TYPE bits for segment. */
  959. X***************
  960. X*** 1137,1142 ****
  961. X--- 1148,1156 ----
  962. X      }            /* if there was a + symbol */
  963. X        if (pcrel)
  964. X      {
  965. X+ #ifdef M_XENIX
  966. X+       if (add_symbol_N_TYPE != N_UNDF)
  967. X+ #endif
  968. X        add_number -=
  969. X  #ifndef NS32K
  970. X            size + 
  971. X***************
  972. X*** 1184,1189 ****
  973. X--- 1198,1204 ----
  974. X  }                /* fixup_segment() */
  975. X  
  976. X  
  977. X+ #ifndef M_XENIX
  978. X  /* The sparc needs its own emit_relocations() */
  979. X  #if !defined(SPARC) && !defined(I860)
  980. X  /*
  981. X***************
  982. X*** 1244,1249 ****
  983. X--- 1259,1265 ----
  984. X  
  985. X  }
  986. X  #endif
  987. X+ #endif /* M_XENIX */
  988. X  
  989. X  int
  990. X  is_dnrange(f1,f2)
  991. X*** gas-1.38/xenixomf.c
  992. X--- xenixomf.c    Wed Jul 10 09:02:18 1991
  993. X***************
  994. X*** 0 ****
  995. X--- 1,660 ----
  996. X+ #include <string.h>
  997. X+ #include <stdio.h>
  998. X+ #include "xenixomf.h"
  999. X+ #include "msomf.h"
  1000. X+ 
  1001. X+ #ifdef M_XENIX
  1002. X+ #  undef i386
  1003. X+ #endif
  1004. X+ 
  1005. X+ #define MAXRECORDSIZE    (14 * 1024)    /* 1k data => 1024 fixups */
  1006. X+ #define I386    1
  1007. X+ 
  1008. X+ extern char *out_file_name;
  1009. X+ 
  1010. X+ static char chksum = 0;
  1011. X+ static unsigned char recordbuff[MAXRECORDSIZE];
  1012. X+ static unsigned char *record_ptr;
  1013. X+ 
  1014. X+ static void copy_bytes_to_record(p, count)
  1015. X+ unsigned char *p;
  1016. X+ int count;
  1017. X+ {
  1018. X+     while (count--)
  1019. X+     {
  1020. X+         *record_ptr++ = *p;
  1021. X+         chksum += *p++;
  1022. X+     }
  1023. X+ }
  1024. X+ 
  1025. X+ static void start_record(type)
  1026. X+ unsigned char type;
  1027. X+ {
  1028. X+     chksum = 0;
  1029. X+     record_ptr = recordbuff;
  1030. X+     copy_bytes_to_record(&type, 1);
  1031. X+     record_ptr += 2;    /* leave space for the record size */
  1032. X+ }
  1033. X+ 
  1034. X+ static void output_record()
  1035. X+ {
  1036. X+     int length;
  1037. X+     unsigned char b;
  1038. X+ 
  1039. X+     length = (record_ptr - recordbuff) + 1; /* 1 for chksum */
  1040. X+ 
  1041. X+     /* patch the record length into the header and put -chksum
  1042. X+      * at the end of the record.
  1043. X+      */
  1044. X+ 
  1045. X+     b = (length - 3) & 0xff;  /* -3 as record length excludes type + len */
  1046. X+     chksum += b;  recordbuff[1] = b;
  1047. X+     b = ((length - 3) >> 8) & 0xff;
  1048. X+     chksum += b;  recordbuff[2] = b;
  1049. X+     *record_ptr = (unsigned char)(-chksum);
  1050. X+ 
  1051. X+     output_file_append (recordbuff, length, out_file_name);
  1052. X+ }
  1053. X+ 
  1054. X+ static void copy_string_to_record(s)
  1055. X+ char *s;
  1056. X+ {
  1057. X+     unsigned char len;
  1058. X+ 
  1059. X+     len = strlen(s);
  1060. X+     if (len > OMFNAMELENGTH)
  1061. X+     {
  1062. X+         char tname[OMFNAMELENGTH+2];
  1063. X+ 
  1064. X+         strncpy(tname, s, OMFNAMELENGTH);
  1065. X+         tname[OMFNAMELENGTH] = '\0';
  1066. X+         fprintf(stderr, "Identifier truncated to %s (%d chars)\n",
  1067. X+                 tname, OMFNAMELENGTH);
  1068. X+         len = OMFNAMELENGTH;
  1069. X+         copy_bytes_to_record(&len, 1);
  1070. X+         copy_bytes_to_record(s, OMFNAMELENGTH);
  1071. X+     }
  1072. X+     else
  1073. X+     {
  1074. X+         copy_bytes_to_record(&len, 1);
  1075. X+         if (len > 0)
  1076. X+             copy_bytes_to_record(s, len);
  1077. X+     }
  1078. X+ }
  1079. X+ 
  1080. X+ static void copy_index_to_record(index)
  1081. X+ unsigned int index;
  1082. X+ {
  1083. X+     unsigned char b;
  1084. X+ 
  1085. X+     if (index < 128)
  1086. X+     {
  1087. X+         b = (unsigned char)(index & 0xff);
  1088. X+         copy_bytes_to_record(&b, 1);
  1089. X+     }
  1090. X+     else
  1091. X+     {
  1092. X+         b = (unsigned char)(((index >> 8) & 0xff) | 0x80);
  1093. X+         copy_bytes_to_record(&b, 1);
  1094. X+         b = (unsigned char)(index & 0xff);
  1095. X+         copy_bytes_to_record(&b, 1);
  1096. X+     }
  1097. X+ }
  1098. X+ 
  1099. X+ static void copy_vint_to_record(value, count)
  1100. X+ long value;
  1101. X+ int count;
  1102. X+ {
  1103. X+     unsigned char b;
  1104. X+ 
  1105. X+     while (count--)
  1106. X+     {
  1107. X+         b = (unsigned char)(value & 0xff);
  1108. X+         copy_bytes_to_record(&b, 1);
  1109. X+         value >>= 8;
  1110. X+     }
  1111. X+ }
  1112. X+ 
  1113. X+ static void copy_word_to_record(value)
  1114. X+ unsigned int value;
  1115. X+ {
  1116. X+     copy_vint_to_record((long)value, 2);
  1117. X+ }
  1118. X+ 
  1119. X+ static void copy_offset_to_record(i386, value)
  1120. X+ int i386;
  1121. X+ long value;
  1122. X+ {
  1123. X+     copy_vint_to_record(value, i386 ? 4 : 2);
  1124. X+ }
  1125. X+ 
  1126. X+ static void copy_comsize_to_record(value)
  1127. X+ long value;
  1128. X+ {
  1129. X+     unsigned char b;
  1130. X+ 
  1131. X+     if (value < 128)
  1132. X+         copy_vint_to_record((long)value, 1);
  1133. X+     else if (value < 65536L)
  1134. X+     {
  1135. X+         b = 0x81;
  1136. X+         copy_bytes_to_record(&b, 1);
  1137. X+         copy_vint_to_record((long)value, 2);
  1138. X+     }
  1139. X+     else if (value < 16777216L)
  1140. X+     {
  1141. X+         b = 0x84;
  1142. X+         copy_bytes_to_record(&b, 1);
  1143. X+         copy_vint_to_record((long)value, 3);
  1144. X+     }
  1145. X+     else
  1146. X+     {
  1147. X+         b = 0x88;
  1148. X+         copy_bytes_to_record(&b, 1);
  1149. X+         copy_vint_to_record((long)value, 4);
  1150. X+     }
  1151. X+ 
  1152. X+ }
  1153. X+ 
  1154. X+ void omf_theadr(name)
  1155. X+ unsigned char *name;
  1156. X+ {
  1157. X+     start_record(MTHEADR);
  1158. X+     copy_string_to_record(name);
  1159. X+     output_record();
  1160. X+ }
  1161. X+ 
  1162. X+ void omf_coment(p, count, class)
  1163. X+ unsigned char *p;
  1164. X+ int count;
  1165. X+ unsigned char class;
  1166. X+ {
  1167. X+     unsigned char attrib;
  1168. X+ 
  1169. X+     start_record(MCOMENT);
  1170. X+     attrib = 0;        /* Purge and List attributes */
  1171. X+     copy_bytes_to_record(&attrib, 1);
  1172. X+     copy_bytes_to_record(&class, 1);
  1173. X+     copy_bytes_to_record(p, count);
  1174. X+     output_record();
  1175. X+ }
  1176. X+ 
  1177. X+ void omf_extdef(name, type)
  1178. X+ unsigned char *name;
  1179. X+ {
  1180. X+     start_record(MEXTDEF);
  1181. X+     copy_string_to_record(name);
  1182. X+     copy_bytes_to_record(&type, 1);
  1183. X+     output_record();
  1184. X+ }
  1185. X+ 
  1186. X+ void omf_start_pubdef(i386, group, segment, frame)
  1187. X+ int i386;
  1188. X+ int group, segment, frame;
  1189. X+ {
  1190. X+     if (i386)
  1191. X+         start_record(MPUB386);
  1192. X+     else
  1193. X+         start_record(MPUBDEF);
  1194. X+ 
  1195. X+     copy_index_to_record(group);
  1196. X+     copy_index_to_record(segment);
  1197. X+     if (group == 0 && segment == 0)
  1198. X+         copy_word_to_record(frame);
  1199. X+ }
  1200. X+ 
  1201. X+ void omf_pubdef(i386, name, offset, type)
  1202. X+ int i386;
  1203. X+ unsigned char *name;
  1204. X+ int type;
  1205. X+ long offset;
  1206. X+ {
  1207. X+     copy_string_to_record(name);
  1208. X+     copy_offset_to_record(i386, offset);
  1209. X+     copy_index_to_record(type);
  1210. X+ }
  1211. X+ 
  1212. X+ void omf_end_pubdef()
  1213. X+ {
  1214. X+     output_record();
  1215. X+ }
  1216. X+ 
  1217. X+ void omf_start_lnames()
  1218. X+ {
  1219. X+     start_record(MLNAMES);
  1220. X+ }
  1221. X+ 
  1222. X+ void omf_lnames(name)
  1223. X+ unsigned char *name;
  1224. X+ {
  1225. X+     copy_string_to_record(name);
  1226. X+ }
  1227. X+ 
  1228. X+ void omf_end_lnames()
  1229. X+ {
  1230. X+     output_record();
  1231. X+ }
  1232. X+ 
  1233. X+ void omf_segdef(i386, acbp, frame, offset, seglen, segname, segclass)
  1234. X+ int i386;
  1235. X+ unsigned char acbp;
  1236. X+ unsigned int frame;
  1237. X+ unsigned int offset;
  1238. X+ long seglen;
  1239. X+ unsigned int segname, segclass;
  1240. X+ {
  1241. X+     unsigned int ovlindex = 0;
  1242. X+     if (i386)
  1243. X+         start_record(MSEG386);
  1244. X+     else
  1245. X+         start_record(MSEGDEF);
  1246. X+ 
  1247. X+     copy_bytes_to_record(&acbp, 1);
  1248. X+     if ((acbp & SD_ALIGN) == SD_ABS)
  1249. X+     {
  1250. X+         copy_word_to_record(frame);
  1251. X+         copy_word_to_record(offset);  /* should be byte - Fix Me */
  1252. X+     }
  1253. X+     copy_offset_to_record(i386, seglen);
  1254. X+     copy_index_to_record(segname);
  1255. X+     copy_index_to_record(segclass);
  1256. X+     copy_index_to_record(ovlindex);
  1257. X+     output_record();
  1258. X+ }
  1259. X+ 
  1260. X+ void omf_start_grpdef(grpname)
  1261. X+ unsigned int grpname;
  1262. X+ {
  1263. X+     start_record(MGRPDEF);
  1264. X+     copy_index_to_record(grpname);
  1265. X+ }
  1266. X+ 
  1267. X+ void omf_grpdef(segindex)
  1268. X+ unsigned int segindex;
  1269. X+ {
  1270. X+     unsigned char b = 0xff;
  1271. X+ 
  1272. X+     copy_bytes_to_record(&b, 1);
  1273. X+     copy_index_to_record(segindex);
  1274. X+ }
  1275. X+ 
  1276. X+ void omf_end_grpdef()
  1277. X+ {
  1278. X+     output_record();
  1279. X+ }
  1280. X+ 
  1281. X+ void omf_start_comdef()
  1282. X+ {
  1283. X+     start_record(MCOMDEF);
  1284. X+ }
  1285. X+ 
  1286. X+ void omf_comdef(name, dataseg_type, length, el_size)
  1287. X+ unsigned char *name;
  1288. X+ unsigned char dataseg_type;
  1289. X+ {
  1290. X+     unsigned char type = 0;
  1291. X+ 
  1292. X+     copy_string_to_record(name);
  1293. X+     copy_bytes_to_record(&type, 1);
  1294. X+     copy_bytes_to_record(&dataseg_type, 1);
  1295. X+ 
  1296. X+     copy_comsize_to_record(length);
  1297. X+     if (dataseg_type == TD_CFAR)
  1298. X+     {
  1299. X+         copy_comsize_to_record(el_size);
  1300. X+     }
  1301. X+ }
  1302. X+ 
  1303. X+ void omf_end_comdef()
  1304. X+ {
  1305. X+     output_record();
  1306. X+ }
  1307. X+ 
  1308. X+ void omf_start_linnum(i386, segindex)
  1309. X+ {
  1310. X+     unsigned char grpindex = 0;
  1311. X+ 
  1312. X+     if (i386)
  1313. X+         start_record(MLIN386);
  1314. X+     else
  1315. X+         start_record(MLINNUM);
  1316. X+ 
  1317. X+     copy_bytes_to_record(&grpindex, 1);
  1318. X+     copy_index_to_record(segindex);
  1319. X+ }
  1320. X+ 
  1321. X+ void omf_linnum(i386, line, offset)
  1322. X+ int i386;
  1323. X+ unsigned int line;
  1324. X+ long offset;
  1325. X+ {
  1326. X+     copy_word_to_record(line);
  1327. X+     copy_offset_to_record(i386, offset);
  1328. X+ }
  1329. X+ 
  1330. X+ void omf_end_linnum()
  1331. X+ {
  1332. X+     output_record();
  1333. X+ }
  1334. X+ 
  1335. X+ void omf_start_thread(i386)
  1336. X+ {
  1337. X+     if (i386)
  1338. X+         start_record(MFIX386);
  1339. X+     else
  1340. X+         start_record(MFIXUPP);
  1341. X+ }
  1342. X+ 
  1343. X+ void omf_thread(thread, framethread, method, index)
  1344. X+ unsigned char thread;
  1345. X+ int framethread;
  1346. X+ unsigned char method;
  1347. X+ unsigned int index;
  1348. X+ {
  1349. X+     unsigned char thread_data;
  1350. X+ 
  1351. X+     thread_data = thread | (method << TRD_MTHDSHFT);
  1352. X+     if (framethread)
  1353. X+         thread_data |= TRD_FRAME;
  1354. X+     copy_bytes_to_record(&thread_data, 1);
  1355. X+ 
  1356. X+     if (framethread)
  1357. X+     {
  1358. X+         switch (method)
  1359. X+         {
  1360. X+         case FRM_SI:
  1361. X+         case FRM_GI:
  1362. X+         case FRM_EI:
  1363. X+         case FRM_ABS:
  1364. X+             copy_index_to_record(index);
  1365. X+             break;
  1366. X+         case FRM_LOC:
  1367. X+         case FRM_TRGT:
  1368. X+             break;
  1369. X+         }
  1370. X+     }
  1371. X+     else
  1372. X+         copy_index_to_record(index);
  1373. X+ }
  1374. X+ 
  1375. X+ void omf_end_thread()
  1376. X+ {
  1377. X+     output_record();
  1378. X+ }
  1379. X+ 
  1380. X+ void omf_start_fixup(i386)
  1381. X+ {
  1382. X+     if (i386)
  1383. X+         start_record(MFIX386);
  1384. X+     else
  1385. X+         start_record(MFIXUPP);
  1386. X+ }
  1387. X+ 
  1388. X+ static void generate_fixdat(i386, f_thrd, frame, t_thrd, trgt, t_sec,
  1389. X+                        frame_index, target_index, offset)
  1390. X+ int i386;
  1391. X+ int f_thrd;
  1392. X+ unsigned int frame;
  1393. X+ int t_thrd;
  1394. X+ unsigned int trgt;
  1395. X+ int t_sec;
  1396. X+ unsigned int frame_index, target_index;
  1397. X+ long offset;
  1398. X+ {
  1399. X+     unsigned char fixdat, b;
  1400. X+ 
  1401. X+     fixdat = (f_thrd ? FIXDAT_FTHRD : 0) | (frame << FIXDAT_FRSHFT);
  1402. X+     fixdat |= (t_thrd ? FIXDAT_TTHRD : 0) | trgt | (t_sec ? FIXDAT_TSCND:0);
  1403. X+     copy_bytes_to_record(&fixdat, 1);
  1404. X+ 
  1405. X+     if (!f_thrd)
  1406. X+     {
  1407. X+         switch (frame)
  1408. X+         {
  1409. X+         case FRM_SI:
  1410. X+         case FRM_GI:
  1411. X+         case FRM_EI:
  1412. X+         case FRM_ABS:
  1413. X+             copy_index_to_record(frame_index);
  1414. X+             break;
  1415. X+         case FRM_LOC:
  1416. X+         case FRM_TRGT:
  1417. X+             break;
  1418. X+         }
  1419. X+     }
  1420. X+ 
  1421. X+     if (!t_thrd)
  1422. X+         copy_index_to_record(target_index);
  1423. X+     
  1424. X+     if (!t_sec)
  1425. X+         copy_offset_to_record(i386, offset);
  1426. X+ }
  1427. X+ 
  1428. X+ void omf_fixup(i386, segrel, loc, data_off, f_thrd, frame, t_thrd, trgt, t_sec,
  1429. X+            frame_index, target_index, offset)
  1430. X+ int i386, segrel;
  1431. X+ unsigned char loc;
  1432. X+ unsigned int data_off;
  1433. X+ int f_thrd;
  1434. X+ unsigned int frame;
  1435. X+ int t_thrd;
  1436. X+ unsigned int trgt;
  1437. X+ int t_sec;
  1438. X+ unsigned int frame_index, target_index;
  1439. X+ long offset;
  1440. X+ {
  1441. X+     unsigned int locat = 0x8000;
  1442. X+     unsigned char fixdat, b;
  1443. X+ 
  1444. X+     locat |= (segrel ? FIX_SEG : 0) | (loc << FIX_LOCSHFT) |
  1445. X+          (data_off & FIX_DATAOFF);
  1446. X+     b = (locat >> 8) & 0xff;  copy_bytes_to_record(&b, 1);
  1447. X+     b = locat & 0xff;  copy_bytes_to_record(&b, 1);
  1448. X+     generate_fixdat(i386, f_thrd, frame, t_thrd, trgt, t_sec, frame_index,
  1449. X+             target_index, offset);
  1450. X+ }
  1451. X+ 
  1452. X+ void omf_end_fixup()
  1453. X+ {
  1454. X+     output_record();
  1455. X+ }
  1456. X+ 
  1457. X+ void omf_start_ledata(i386, segindex, start_offset)
  1458. X+ int i386;
  1459. X+ unsigned int segindex;
  1460. X+ long start_offset;
  1461. X+ {
  1462. X+     if (i386)
  1463. X+         start_record(MLED386);
  1464. X+     else
  1465. X+         start_record(MLEDATA);
  1466. X+ 
  1467. X+     copy_index_to_record(segindex);
  1468. X+     copy_offset_to_record(i386, start_offset);
  1469. X+ }
  1470. X+ 
  1471. X+ void omf_ledata(data, count)
  1472. X+ unsigned char *data;
  1473. X+ int count;
  1474. X+ {
  1475. X+     copy_bytes_to_record(data, count);
  1476. X+     
  1477. X+ }
  1478. X+ 
  1479. X+ void omf_end_ledata()
  1480. X+ {
  1481. X+     output_record();
  1482. X+ }
  1483. X+ 
  1484. X+ void omf_main_modend(i386, f_thrd, frame, t_thrd, trgt, t_sec, frame_index,
  1485. X+              target_index, offset)
  1486. X+ int i386;
  1487. X+ int f_thrd;
  1488. X+ unsigned int frame;
  1489. X+ int t_thrd;
  1490. X+ unsigned int trgt;
  1491. X+ int t_sec;
  1492. X+ unsigned int frame_index, target_index;
  1493. X+ long offset;
  1494. X+ {
  1495. X+     unsigned char mtype = 0xc1;
  1496. X+ 
  1497. X+     if (i386)
  1498. X+         start_record(M386END);
  1499. X+     else
  1500. X+         start_record(MMODEND);
  1501. X+ 
  1502. X+     copy_bytes_to_record(&mtype, 1);
  1503. X+ 
  1504. X+     generate_fixdat(i386, f_thrd, frame, t_thrd, trgt, t_sec, frame_index,
  1505. X+             target_index, offset);
  1506. X+     output_record();
  1507. X+ }
  1508. X+ 
  1509. X+ void omf_modend(i386)
  1510. X+ int i386;
  1511. X+ {
  1512. X+     unsigned char mtype = 0;
  1513. X+ 
  1514. X+     if (i386)
  1515. X+         start_record(M386END);
  1516. X+     else
  1517. X+         start_record(MMODEND);
  1518. X+ 
  1519. X+     copy_bytes_to_record(&mtype, 1);
  1520. X+     output_record();
  1521. X+ }
  1522. X+ 
  1523. X+ /** Definitions required to produce a standard Microsoft .o file
  1524. X+  */
  1525. X+ 
  1526. X+ /** LNAMES, SEGDEF, GRPDEF and COMENT stuff
  1527. X+  *
  1528. X+  *  NB the following defines must reflect the position of the string in
  1529. X+  *  the lnames_tab table.
  1530. X+  */
  1531. X+ 
  1532. X+ #define    L_BLANK        1
  1533. X+ #define    L_DGROUP    2
  1534. X+ #define L_UTEXT        3
  1535. X+ #define L_CODE        4
  1536. X+ #define L_UDATA        5
  1537. X+ #define L_DATA        6
  1538. X+ #define L_CONST        7
  1539. X+ #define L_UBSS        8
  1540. X+ #define L_BSS        9
  1541. X+ #define L_TYPES        10
  1542. X+ #define L_DEBTYP    11
  1543. X+ #define L_SYMBOLS    12
  1544. X+ #define L_DEBSYM    13
  1545. X+ #define L_TSIZE        9
  1546. X+ #define L_G_TSIZE    13
  1547. X+ 
  1548. X+ char *lnames_tab[] = {
  1549. X+     "",
  1550. X+     "",
  1551. X+     "DGROUP",
  1552. X+     "_TEXT",
  1553. X+     "CODE",
  1554. X+     "_DATA",
  1555. X+     "DATA",
  1556. X+     "CONST",
  1557. X+     "_BSS",
  1558. X+     "BSS",
  1559. X+     "$$TYPES",
  1560. X+     "DEBTYP",
  1561. X+     "$$SYMBOLS",
  1562. X+     "DEBSYM"
  1563. X+ };
  1564. X+ 
  1565. X+ struct segtable {
  1566. X+     unsigned char attrib;
  1567. X+     long length;
  1568. X+     unsigned nameindex;
  1569. X+     unsigned classindex;
  1570. X+ };
  1571. X+ 
  1572. X+ /* SEGDEF's */
  1573. X+ 
  1574. X+ static struct segtable segt[] = {
  1575. X+     {0, NULL, 0, 0},
  1576. X+     {SD_DWORD|SD_PUBLIC|SD_PGRES, 0, L_UTEXT, L_CODE},
  1577. X+     {SD_DWORD|SD_PUBLIC|SD_PGRES, 0, L_UDATA, L_DATA},
  1578. X+     {SD_DWORD|SD_PUBLIC|SD_PGRES, 0, L_CONST, L_CONST},
  1579. X+     {SD_DWORD|SD_PUBLIC|SD_PGRES, 0, L_UBSS, L_BSS},
  1580. X+     {SD_BYTE|SD_PGRES, 0, L_SYMBOLS, L_DEBSYM},
  1581. X+     {SD_BYTE|SD_PGRES, 0, L_TYPES, L_DEBTYP}
  1582. X+ };
  1583. X+ 
  1584. X+ /* GRPDEF */
  1585. X+ 
  1586. X+ #define GRPTABSIZ 3
  1587. X+ 
  1588. X+ unsigned int group_tab[GRPTABSIZ] = {3, 4, 2};
  1589. X+ 
  1590. X+ /* COMENTs */
  1591. X+ 
  1592. X+ struct comment {
  1593. X+     unsigned char class;
  1594. X+     unsigned char count;
  1595. X+     unsigned char *data;
  1596. X+ };
  1597. X+ 
  1598. X+ #define NUMFIXEDCOMMENTS 4
  1599. X+ 
  1600. X+ static unsigned char gas_comment[] = "gas-1.38.1a";
  1601. X+ static unsigned char lib_comment[] = "SLIBCE";
  1602. X+ static unsigned char model_comment[] = "3s";
  1603. X+ static unsigned char msext_comment[] = {1, 0x43, 0x56};
  1604. X+ 
  1605. X+ struct comment fix_cmnt[NUMFIXEDCOMMENTS] = {
  1606. X+     {0, 8, gas_comment},
  1607. X+     {0x9f, 6, lib_comment},
  1608. X+     {0x9d, 2, model_comment},
  1609. X+     {0xa1, 3, msext_comment}
  1610. X+ };
  1611. X+ 
  1612. X+ void omf_initialize_a_out(name, text_size, data_size, bss_size, const_size,
  1613. X+               gdb, syms_size, str_size)
  1614. X+ unsigned char *name;
  1615. X+ long text_size, data_size, bss_size, const_size;
  1616. X+ int gdb;
  1617. X+ long syms_size, str_size;
  1618. X+ {
  1619. X+     int i;
  1620. X+ 
  1621. X+     omf_theadr(name);
  1622. X+ 
  1623. X+     /* static comments */
  1624. X+ 
  1625. X+     for (i = 0; i < NUMFIXEDCOMMENTS; i++)
  1626. X+       omf_coment(fix_cmnt[i].data, fix_cmnt[i].count, fix_cmnt[i].class);
  1627. X+ 
  1628. X+     /* LNAMES */
  1629. X+ 
  1630. X+     omf_start_lnames();
  1631. X+     for (i = 1; i <= (gdb ? L_G_TSIZE : L_TSIZE); i++)
  1632. X+         omf_lnames(lnames_tab[i]);
  1633. X+     omf_end_lnames();
  1634. X+ 
  1635. X+     /* SEGDEFS */
  1636. X+ 
  1637. X+     segt[SDEF_TEXT].length = text_size;
  1638. X+     segt[SDEF_DATA].length = data_size;
  1639. X+     segt[SDEF_BSS].length = bss_size;
  1640. X+     segt[SDEF_CONST].length = const_size;
  1641. X+     if (gdb)
  1642. X+     {
  1643. X+         segt[SDEF_SYMBOLS].length = syms_size;
  1644. X+         segt[SDEF_TYPES].length = str_size;
  1645. X+     }
  1646. X+     for (i = 1; i <= (gdb ? SDEF_G_SIZE : SDEF_SIZE); i++)
  1647. X+         omf_segdef(I386, segt[i].attrib, 0, 0L, segt[i].length,
  1648. X+                segt[i].nameindex, segt[i].classindex);
  1649. X+     /* DGROUP */
  1650. X+ 
  1651. X+     omf_start_grpdef(L_DGROUP);
  1652. X+     for (i = 0; i < GRPTABSIZ; i++)
  1653. X+         omf_grpdef(group_tab[i]);
  1654. X+     omf_end_grpdef();
  1655. X+ }
  1656. X*** gas-1.38/xenixomf.h
  1657. X--- xenixomf.h    Wed Jul 10 09:02:21 1991
  1658. X***************
  1659. X*** 0 ****
  1660. X--- 1,140 ----
  1661. X+ 
  1662. X+ /* Defines to map a.out definitions to OMF style definitions
  1663. X+  */
  1664. X+ #define    PUBLICDATA    (N_DATA|N_EXT)
  1665. X+ #define    PUBLICTEXT    (N_TEXT|N_EXT)
  1666. X+ #define    PUBLICABS    (N_ABS|N_EXT)
  1667. X+ #define COMMDEF(x)    ((x) == (N_UNDF|N_EXT))
  1668. X+ #define PRIVDATA    (N_DATA)
  1669. X+ #define PRIVTEXT    (N_TEXT)
  1670. X+ #define PRIVBSS        (N_BSS)
  1671. X+ #define EXTERNAL    (N_UNDF)
  1672. X+ #define PUBLIC(x)    ((x)==PUBLICDATA || (x)==PUBLICTEXT || (x)==PUBLICABS)
  1673. X+ #define EXTDEF(x)    ((x)==EXTERNAL || COMMDEF(x))
  1674. X+ #define PRIVATE(x)    ((x)==PRIVDATA || (x)==PRIVTEXT || (x)==PRIVBSS)
  1675. X+ 
  1676. X+ 
  1677. X+ #define MTHEADR        0x80    /* module header */
  1678. X+ #define MCOMENT        0x88    /* comment */
  1679. X+ #define MMODEND        0x8a    /* module end */
  1680. X+ #define M386END        0x8b    /* 32 bit module end */
  1681. X+ #define MEXTDEF        0x8c    /* external definition */
  1682. X+ #define MTYPDEF        0x8e    /* type definition */
  1683. X+ #define MPUBDEF        0x90    /* public definition */
  1684. X+ #define MPUB386        0x91    /* 32 bit public definition */
  1685. X+ #define MLINNUM        0x94    /* source line number */
  1686. X+ #define MLIN386        0x95    /* 32 bit source line number */
  1687. X+ #define MLNAMES        0x96    /* name list */
  1688. X+ #define MSEGDEF        0x98    /* segment definition */
  1689. X+ #define MSEG386        0x99    /* 32 bit segment definition */
  1690. X+ #define MGRPDEF        0x9a    /* group definition */
  1691. X+ #define MFIXUPP        0x9c    /* fix up previous data image */
  1692. X+ #define MFIX386        0x9d    /* fix up previous 32 bit data image */
  1693. X+ #define MLEDATA        0xa0    /* logical data image */
  1694. X+ #define MLED386        0xa1    /* 32 bit logical data image */
  1695. X+ #define    MCOMDEF        0xb0    /* communal names definition */
  1696. X+ 
  1697. X+ /* The maximum length of an identifier.
  1698. X+  */
  1699. X+ 
  1700. X+ #define OMFNAMELENGTH    127
  1701. X+ 
  1702. X+ /* alignment required
  1703. X+  */
  1704. X+ 
  1705. X+ #define SD_ABS        0x00        /* absolute */
  1706. X+ #define SD_BYTE        0x20        /* byte */
  1707. X+ #define SD_WORD        0x40        /* word */
  1708. X+ #define SD_PARA        0x60        /* paragraph */
  1709. X+ #define SD_PAGE        0x80        /* page */
  1710. X+ #define SD_DWORD    0xa0        /* double word */
  1711. X+ #define SD_LTL        0xc0        /* load-time locatable */
  1712. X+ #define SD_ALIGN    0xe0        /* alignment mask */
  1713. X+ #define SD_ASHIFT    5        /* alignment shift */
  1714. X+ 
  1715. X+ /* segment combine classes */
  1716. X+ 
  1717. X+ #define SD_PRIV        0x00        /* private, can't be combined */
  1718. X+ #define SD_HCOMM    0x04        /* common, place in high mem */
  1719. X+ #define SD_PUBLIC    0x08        /* public, sequential */
  1720. X+ #define SD_BAD        0x0c        /* undefined */
  1721. X+ #define SD_C4        0x10        /* not used */
  1722. X+ #define SD_STACK    0x14        /* stack segment */
  1723. X+ #define SD_COMM        0x18        /* common segment */
  1724. X+ #define SD_RCOMM    0x1c        /* not used, reverse common segment */
  1725. X+ #define SD_COMBO    0x1c        /* combine mask */
  1726. X+ #define SD_CSHIFT    2        /* combine shift */
  1727. X+ #define SD_PGRES    0x01        /* page resident */
  1728. X+ #define SD_64K        0x02        /* segment size is exactly 64k */
  1729. X+ 
  1730. X+ /* BSSDEF record definitions
  1731. X+  */
  1732. X+ 
  1733. X+ #define    TD_CNEAR    0x62        /* near .comm variable */
  1734. X+ #define    TD_CFAR        0x61        /* far .comm variable */
  1735. X+ 
  1736. X+ /* COMENT record definitions
  1737. X+  */
  1738. X+ 
  1739. X+ #define     CMT_PURGE    0x80        /* comment can be purged */
  1740. X+ #define  CMT_LIST    0x40        /* don't list when listing comments */
  1741. X+ 
  1742. X+ /* FIXUP record definitions
  1743. X+  */
  1744. X+ 
  1745. X+ #define  FIX_FIXUP    0x80        /* fixup is a fixup (else thread def) */
  1746. X+ #define  TRD_FRAME    0x40        /* thread def for a frame (else tgt) */
  1747. X+ #define  TRD_MTHDSHFT    2        /* frame / target method shift */
  1748. X+ #define  TRD_MTHDMSK    0x1c        /* frame / target method mask */
  1749. X+ #define  TRD_THRED    0x03        /* thread number mask */
  1750. X+ 
  1751. X+ /* Target method defines.  0 - 3 are primary, they include an offset, while 
  1752. X+  * 4 - 7 or secondary, the offset 0 and not specified.
  1753. X+  */
  1754. X+ 
  1755. X+ #define  TGT_SI        0        /* target is Segment Index(N) + M */
  1756. X+ #define  TGT_GI        1        /* target is Group Index(N) + M */
  1757. X+ #define  TGT_EI        2        /* target is External Index(N) + M */
  1758. X+ #define  TGT_ABS    3        /* target is absolute frame N + N */
  1759. X+ #define  TGT_SI_0    4        /* target is Segment Index(N) + 0 */
  1760. X+ #define  TGT_GI_0    5        /* target is Group Index(N) + 0 */
  1761. X+ #define  TGT_EI_0    6        /* target is External Index(N) + 0 */
  1762. X+ #define  TGT_ABS_0    7        /* target is Absolute Segmnent N + 0 */
  1763. X+ 
  1764. X+ /* Frame fixup method
  1765. X+  */
  1766. X+ 
  1767. X+ #define  FRM_SI        0        /* Frame is Segment index(N) */
  1768. X+ #define  FRM_GI        1        /* Frame is Group index(N) */
  1769. X+ #define  FRM_EI        2        /* Frame is External index(N) */
  1770. X+ #define  FRM_ABS    3        /* Frame is Absolute frame(N) */
  1771. X+ #define  FRM_LOC    4        /* Frame is LSEG of LOCATION */
  1772. X+ #define  FRM_TRGT    5        /* Frame is the frame of the target */
  1773. X+ 
  1774. X+ /* FIXUP fixdat field definitions
  1775. X+  */
  1776. X+ 
  1777. X+ #define  FIX_SEG    0x4000        /* Fixup is seg relative (else self) */
  1778. X+ #define  FIX_24BIT    0x2000        /* Fixup has 24b tgt disp (NOT USED) */
  1779. X+ #define  FIX_LOCMSK    0x3c00        /* Fixup location type mask */
  1780. X+ #define  FIX_LOCSHFT    10        /* Fixup location type shift */
  1781. X+ #define  FIX_DATAOFF    0x3ff        /* location in prev data rec of fixup */
  1782. X+ #define  FIXDAT_FTHRD    0x80        /* Fixup frame by thread else direct */
  1783. X+ #define  FIXDAT_FRAME    0x70        /* Frame thread or method mask */
  1784. X+ #define  FIXDAT_FRSHFT    4        /* Frame thread or method shift */
  1785. X+ #define  FIXDAT_TTHRD    0x08        /* Fixup target by thread else direct */
  1786. X+ #define  FIXDAT_TSCND    0x04        /* Primary or secondary target method */
  1787. X+ #define  FIXDAT_TRGT    0x03        /* Target thread or method mask */
  1788. X+ 
  1789. X+ /* Location type definitions
  1790. X+  */
  1791. X+ 
  1792. X+ #define  LOC_LOBYTE    0        /* low 8 bits */
  1793. X+ #define  LOC_OFFSET    1        /* 16 bit offset */
  1794. X+ #define  LOC_BASE    2        /* 16 bit frame number */
  1795. X+ #define  LOC_POINTER    3        /* 32 bit pointer */
  1796. X+ #define  LOC_HIBTE    4        /* second 8 bits */
  1797. X+ #define  LOC_OFFSETL    5        /* 16 bit offset (liner resolved) */
  1798. X+ #define  LOC_OFFSET32    9        /* 32 bit offset */
  1799. X+ #define  LOC_POINTER48    11        /* 48 bit pointer */
  1800. X+ #define  LOC_OFFSETL32    13        /* 32 bit offset (liner resolved) */
  1801. X
  1802. END_OF_FILE
  1803.   if test 47292 -ne `wc -c <'gas-1.38.pch'`; then
  1804.     echo shar: \"'gas-1.38.pch'\" unpacked with wrong size!
  1805.   fi
  1806.   # end of 'gas-1.38.pch'
  1807. fi
  1808. echo shar: End of archive.
  1809. exit 0
  1810. -- 
  1811. Steve.Bleazard@RoboBar.Co.Uk        | Phone:  +44 81 991 1142 x153
  1812. Snr Software Engineer, Robobar Ltd. | Fax:    +44 81 998 8343 (G3)
  1813. 22 Wadsworth Road, Perivale.        |
  1814. Middx., UB6 7JD ENGLAND.            | ...!ukc!robobar!steve
  1815.  
  1816. exit 0 # Just in case...
  1817. -- 
  1818. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1819. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1820. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1821. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1822.